// 使用C语言调用python来识别垃圾类型

#include "garbage.h"

// 初始化操作
void garbage_initialize()
{
    // 初始化Python解释器
    Py_Initialize();

    // 获取sys.path对象
    PyObject *sys = PyImport_ImportModule("sys");
    PyObject *path = PyObject_GetAttrString(sys, "path");

    // 将当前路径添加到sys.path
    // PyUnicode_FromStrin 将 C 风格的字符串（即 char* 类型）转换为 Python 的 Unicode 字符串对象
    PyList_Append(path, PyUnicode_FromString("."));
}

void garbage_Finalize()
{
    // 关闭Python解释器
    Py_Finalize();
}

// 识别垃圾类型
char* garbage_category(char *category)
{
    // 导入para模块
    PyObject *pModule = PyImport_ImportModule("garbage");
    if(!pModule)
    {
        PyErr_Print();
        printf("ERROR:failed to load garbage.py\n");
        goto FAILED_MODULE;
    }

    // 获取函数对象，并检查是否可以调用
    PyObject *pFunc = PyObject_GetAttrString(pModule, "alibabacloud_garbage");
    if(!pFunc || !PyCallable_Check(pFunc))
    {
        PyErr_Print();
        printf("ERROR:function alibabacloud_garbage not found or not callable\n");
        goto FAILED_FUNC;
    }

    // 函数调用Python函数，并获取返回值。
    PyObject *pvalue = PyObject_CallObject(pFunc, NULL);
    if(!pvalue)
    {
        PyErr_Print();
        printf("ERROR:function call failed\n");
        goto FAILED_VALUE;
    }   

    // 用int PyArg_Parse(PyObject *args, const char *format, ...)函数将返回值转换为C类型，并检查是否有错误,没有返回值时不需要调用。
    char *result = NULL;
    if(!PyArg_Parse(pvalue,"s",&result))
    {
        PyErr_Print();
        printf("Error: parse failed\n");
        goto FAILED_RESULT;
    }

    // 打印返回值
    //printf("pvalue = %s\n",result);

    category = (char*)malloc(strlen(result)+1);
    strncpy(category,result,(strlen(result)+1));
    
    // 函数释放所有引用的Python对象
FAILED_RESULT:
    Py_DECREF(pvalue);
FAILED_VALUE:
    Py_DECREF(pFunc);
FAILED_FUNC:
    Py_DECREF(pModule);
FAILED_MODULE:    
    return category;
}